home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / BOBOLI.ZIP / SRC / BEDIT.C next >
Encoding:
C/C++ Source or Header  |  1996-06-04  |  7.9 KB  |  370 lines

  1. /* 
  2.   BOBOLI map editor
  3. */
  4. #include "mgraph.h"
  5. #include "umk.h"
  6. #include "mfont.h"
  7. #include "boboli.h"
  8. #include <stdio.h>
  9.  
  10. umkset u1,u2;
  11. centerray ob;
  12. scrntype scrn;
  13. paltype hulkpal;
  14. colmat dark;
  15. maprec map;
  16. genrec gen[maxgen];
  17. tileset tiles;
  18.  
  19. void loadctr(char *name,centerray c)
  20. {
  21.   FILE *f;
  22.   f=fopen(name,"rb");
  23.   fread(c,1,sizeof(centerray),f);
  24.   fclose(f);
  25. }
  26.  
  27. byte calc_shadows(byte x,byte y)
  28. {
  29.   byte v;
  30.   if(map[x+y*mapwidth].floor>63) return 0; /* no shadows on walls */
  31.   if(x==0) {
  32.     if(y==0) return 6;
  33.     else if(map[x+(y-1)*mapwidth].floor>63) return 6;
  34.     else return 2;
  35.   }
  36.   if(y==0) { 
  37.     if(map[x-1+y*mapwidth].floor>63) return 6;
  38.     else return 4;
  39.   }
  40.   if(map[x-1+y*mapwidth].floor>63) {
  41.     if(map[x+(y-1)*mapwidth].floor>63) return 6;
  42.     if(map[x-1+(y-1)*mapwidth].floor>63) return 2;
  43.     else return 1;
  44.   }
  45.   if(map[x+(y-1)*mapwidth].floor>63) {
  46.     if(map[x-1+(y-1)*mapwidth].floor>63) return 4;
  47.     else return 5;
  48.   }
  49.   if(map[x-1+(y-1)*mapwidth].floor>63) return 3;
  50.   return 0;
  51. }
  52.  
  53. void clear_map(void)
  54. {
  55.   short i,j;
  56.   for(i=0;i<mapwidth;i++)
  57.     for(j=0;j<mapheight;j++) {
  58.       map[i+j*mapwidth].floor=0;
  59.       map[i+j*mapwidth].object=0;
  60.       map[i+j*mapwidth].shadow=calc_shadows(i,j);
  61.     }
  62.   for(i=0;i<maxgen;i++)
  63.     gen[i].kind=gn_none;
  64. }
  65.  
  66. void loadtiles(char *name,tileset t)
  67. {
  68.   short i,j,k,x,y;
  69.   paltype p;
  70.   loadPCX(name,p,scrn);
  71.   x=0; y=0;
  72.   for(i=0;i<128;i++) {
  73.     for(j=0;j<16;j++)
  74.       for(k=0;k<16;k++)
  75.         t[i][j+k*16]=scrn[x+j+(y+k)*320];
  76.     x+=16;
  77.     if(x>319) {
  78.       x=0;
  79.       y+=16;
  80.     }
  81.   }
  82. }
  83.  
  84. void edit_init()
  85. {
  86.   __djgpp_nearptr_enable();
  87.   initmg();
  88.   font_init("misc\\little.fnt");
  89.   gmode(0x13);
  90.   scrn=(scrntype)malloc(64000);
  91.   loadpal("misc\\hulk.pal",hulkpal);
  92.   setpal(hulkpal);
  93.   mat_load("misc\\dark.mat",dark);
  94.   umk_load("umks\\stuff.umk",u1);
  95.   umk_load("umks\\objects.umk",u2);
  96.   loadctr("ctr\\objects.ctr",ob);
  97.   loadtiles("pcx\\tiles.pcx",tiles);
  98.   clear_map();
  99. }
  100.  
  101. void edit_exit()
  102. {
  103.   gmode(0x3);
  104.   umk_free(u1);
  105.   umk_free(u2);
  106.   free(scrn);
  107.   __djgpp_nearptr_disable();
  108. }
  109.  
  110. void display_tile(short x,short y,tilerec t,scrntype scrn)
  111. {
  112.   byte i;
  113.   for(i=0;i<16;i++) memcpy(&(scrn[x+(y+i)*320]),&(tiles[t.floor][i*16]),16);
  114.   switch(t.object) {
  115.     case ob_none: break;
  116.     case ob_genrtr: umk_draw(x+8-ob[0].x,y+8-ob[0].y,u2[0],scrn);
  117.                     break;
  118.     default: umk_draw(x+8-ob[44+t.object].x,y+8-ob[44+t.object].y,u2[44+t.object],scrn);
  119.                      break;
  120.   }
  121.   if(t.shadow>0)
  122.     umk_shadow(x,y,dark,u1[t.shadow-1],scrn);
  123. }
  124.  
  125. void display_map(byte x,byte y)
  126. {
  127.   short i,j;
  128.   for(i=x;i<x+12;i++)
  129.     for(j=y;j<y+11;j++) 
  130.       display_tile((i-x)*16,(j-y)*16,map[i+j*mapwidth],scrn);
  131. }
  132.  
  133. void loadmap(void)
  134. {
  135.   FILE *f;
  136.   f=fopen("temp.map","rb");
  137.   fread(map,sizeof(maprec),1,f);
  138.   fread(gen,sizeof(genrec)*maxgen,1,f);
  139.   fclose(f);
  140. }
  141.  
  142. void savemap(void)
  143. {
  144.   FILE *f;
  145.   f=fopen("temp.map","wb");
  146.   fwrite(map,sizeof(maprec),1,f);
  147.   fwrite(gen,sizeof(genrec)*maxgen,1,f);
  148.   fclose(f);
  149. }
  150.  
  151. void add_genrtr(byte x,byte y,byte kind)
  152. {
  153.   byte i;
  154.   for(i=0;i<maxgen;i++) {
  155.     if(gen[i].kind==gn_none) {
  156.       gen[i].x=x;
  157.       gen[i].y=y;
  158.       gen[i].kind=kind;
  159.       gen[i].timer=255;
  160.       gen[i].hp=150;
  161.       i=maxgen;
  162.     }
  163.   }
  164. }
  165.  
  166. void rm_generator(byte x,byte y) 
  167. {
  168.   byte i;
  169.   for(i=0;i<maxgen;i++) 
  170.     if((gen[i].x==x)&&(gen[i].y==y)) gen[i].kind=gn_none;
  171. }
  172.  
  173. void dot_tile(short x,short y,tilerec t)
  174. {
  175.   byte i;
  176.   if((t.floor<3)||(t.floor==15)) i=3;
  177.   if((t.floor==3)) i=21;
  178.   if(t.floor==4) i=19;
  179.   if(t.floor==5) i=169;
  180.   if((t.floor>5)&&(t.floor<15)) i=165;
  181.   if((t.floor==64)||(t.floor==65)) i=215;
  182.   if((t.floor>65)&&(t.floor<82)) i=8;
  183.   screen[x+y*320]=i;
  184.   if(t.object>0) screen[x+y*320]=15;
  185.   if(t.object==ob_genrtr) screen[x+y*320]=55;
  186. }
  187.  
  188. void dot_map()
  189. {
  190.   short i,j;
  191.   for(i=0;i<mapwidth;i++)
  192.     for(j=0;j<mapheight;j++) 
  193.       dot_tile(i,j,map[i+j*mapwidth]);
  194. }
  195.  
  196.  
  197. void editit(void)
  198. {
  199.   short sx=0,sy=0;
  200.   byte x=0,y=0,done=0,fusing=0,lock=0;
  201.   tilerec fusing_t;
  202.   char a;
  203.   clear(0,scrn);
  204.   fusing_t.floor=0;
  205.   fusing_t.shadow=0;
  206.   fusing_t.object=0;
  207.   while(!done) {
  208.     display_map(sx,sy);
  209.     display_tile(220,0,fusing_t,scrn);
  210.     near_scrcpy(scrn,screen);
  211.     while(!kbhit()) {
  212.       box((x-sx)*16,(y-sy)*16,(x-sx)*16+15,(y-sy)*16,random()%256,screen);
  213.       box((x-sx)*16,(y-sy)*16+15,(x-sx)*16+15,(y-sy)*16+15,random()%256,screen);
  214.       qdelay(1000);
  215.     }
  216.     a=getch();
  217.     if(a==27) done=1;
  218.     if(a==0) {
  219.       a=getch();
  220.       if(a==60) savemap();
  221.       if(a==61) loadmap();
  222.     }
  223.     if(a=='l') lock=1-lock;
  224.     if(a=='8') {
  225.       if(lock) a=' ';
  226.       y--;
  227.       if(y>mapheight) y=mapheight-1;
  228.     }
  229.     if(a=='6') {
  230.       if(lock) a=' ';
  231.       x++;
  232.       if(x==mapwidth) x=0;
  233.     }
  234.     if(a=='2') {
  235.       if(lock) a=' ';
  236.       y++;
  237.       if(y==mapheight) y=0;
  238.     }
  239.     if(a=='4') {
  240.       if(lock) a=' ';
  241.       x--;
  242.       if(x>mapwidth) x=mapwidth-1;
  243.     }
  244.     if(a==' ') {
  245.       map[x+y*mapwidth].floor=fusing;
  246.       map[x+y*mapwidth].shadow=calc_shadows(x,y);
  247.       if(x<mapwidth-1) map[x+1+y*mapwidth].shadow=calc_shadows(x+1,y);
  248.       if(y<mapheight-1) {
  249.         if(x<mapwidth-1) map[x+1+(y+1)*mapwidth].shadow=calc_shadows(x+1,y+1);
  250.         map[x+(y+1)*mapwidth].shadow=calc_shadows(x,y+1);
  251.       }
  252.     }
  253.     if(a=='-') {
  254.       fusing--;
  255.       if(fusing>127) fusing=127;
  256.       fusing_t.floor=fusing;
  257.     }
  258.     if(a=='=') {
  259.       fusing++;
  260.       if(fusing>127) fusing=0;
  261.       fusing_t.floor=fusing;
  262.     }
  263.     if(a=='_') {
  264.       fusing=0;
  265.       fusing_t.floor=fusing;
  266.     }
  267.     if(a=='+') {
  268.       fusing=64;
  269.       fusing_t.floor=fusing;
  270.     }
  271.     if(a=='q') {
  272.       rm_generator(x,y);
  273.       map[x+y*mapwidth].object=ob_none;
  274.     }
  275.     if(a=='w') {
  276.       map[x+y*mapwidth].object=ob_xbow;
  277.       rm_generator(x,y);
  278.     }
  279.     if(a=='e') {
  280.       map[x+y*mapwidth].object=ob_genrtr;
  281.       rm_generator(x,y);
  282.       add_genrtr(x,y,gn_bonehead);
  283.     }
  284.     if(a=='r') {
  285.       map[x+y*mapwidth].object=ob_genrtr;
  286.       rm_generator(x,y);
  287.       add_genrtr(x,y,gn_glob);
  288.     }
  289.     if(a=='t') {
  290.       map[x+y*mapwidth].object=ob_fball;
  291.       rm_generator(x,y);
  292.     }
  293.     if(a=='y') {
  294.       map[x+y*mapwidth].object=ob_inferno;
  295.       rm_generator(x,y);
  296.     }
  297.     if(a=='u') {
  298.       map[x+y*mapwidth].object=ob_3xbow;
  299.       rm_generator(x,y);
  300.     }
  301.     if(a=='i') {
  302.       map[x+y*mapwidth].object=ob_elfswd;
  303.       rm_generator(x,y);
  304.     }
  305.     if(a=='o') {
  306.       map[x+y*mapwidth].object=ob_gntswd;
  307.       rm_generator(x,y);
  308.     }
  309.     if(a=='p') {
  310.       map[x+y*mapwidth].object=ob_souledge;
  311.       rm_generator(x,y);
  312.     }
  313.     if(a=='a') {
  314.       map[x+y*mapwidth].object=ob_mirshield;
  315.       rm_generator(x,y);
  316.     }
  317.     if(a=='s') {
  318.       map[x+y*mapwidth].object=ob_tornado;
  319.       rm_generator(x,y);
  320.     }
  321.     if(a=='d') {
  322.       map[x+y*mapwidth].object=ob_fxbow;
  323.       rm_generator(x,y);
  324.     }
  325.     if(a=='f') {
  326.       map[x+y*mapwidth].object=ob_greenthumb;
  327.       rm_generator(x,y);
  328.     }
  329.     if(a=='g') {
  330.       map[x+y*mapwidth].object=ob_invis;
  331.       rm_generator(x,y);
  332.     }
  333.     if(a=='h') {
  334.       map[x+y*mapwidth].object=ob_shieldspl;
  335.       rm_generator(x,y);
  336.     }
  337.     if(a=='j') {
  338.       map[x+y*mapwidth].object=ob_healing;
  339.       rm_generator(x,y);
  340.     }
  341.     if(a=='k') {
  342.       map[x+y*mapwidth].object=ob_summon;
  343.       rm_generator(x,y);
  344.     }
  345.     if(a==9) {
  346.       dot_map();
  347.       while(!kbhit()) {
  348.         screen[x+y*320]=random()%256;
  349.         screen[64+64*320]=random()%256;
  350.       }
  351.       getch();
  352.     }
  353.     if(x>sx+10) sx=x-10;
  354.     if(x<sx+2) sx=x-2;
  355.     if(y>sy+8) sy=y-8;
  356.     if(y<sy+2) sy=y-2;
  357.     if(sx<0) sx=0;
  358.     if(sx>mapwidth-12) sx=mapwidth-12;
  359.     if(sy<0) sy=0;
  360.     if(sy>mapheight-11) sy=mapheight-11;
  361.   }
  362. }
  363.  
  364. void main(void)
  365. {
  366.   edit_init();
  367.   editit();
  368.   edit_exit();
  369. }
  370.